package com.cmo.rzl.shine.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cmo.rzl.core.dao.Blade;
import com.cmo.rzl.core.jfinal.ext.kit.JsonKit;
import com.cmo.rzl.core.toolbox.Record;
import com.cmo.rzl.shine.model.Doctor;
import com.cmo.rzl.shine.model.PatientCode;
import com.cmo.rzl.shine.model.PatientQueue;
import com.cmo.rzl.shine.model.QueueType;
import com.cmo.rzl.shine.service.DoctorService;
import com.cmo.rzl.shine.service.PatientCodeService;
import com.cmo.rzl.shine.service.PatientQueueService;
import com.cmo.rzl.shine.service.QueueTypeService;
import com.cmo.rzl.shine.service.impl.DoctorServiceImpl;
import com.cmo.rzl.shine.service.impl.PatientCodeServiceImpl;
import com.cmo.rzl.shine.service.impl.PatientQueueServiceImpl;
import com.cmo.rzl.shine.service.impl.QueueTypeServiceImpl;
import com.cmo.rzl.system.controller.base.UrlPermissController;
import com.jfinal.kit.StrKit;

/**
 * Generated by Blade. 2017-08-03 10:50:24
 */
public class PatientQueueController extends UrlPermissController {
	private static String CODE = "patientQueue";
	private static String PERFIX = "patient_queue";
	private static String LIST_SOURCE = "PatientQueue.list";
	private static String BASE_PATH = "/platform/patientQueue/";

	PatientQueueService service = new PatientQueueServiceImpl();

	public void index() {
		setAttr("code", CODE);
		render(BASE_PATH + "patientQueue.html");
	}

	public void add() {
		setAttr("code", CODE);
		render(BASE_PATH + "patientQueue_add.html");
	}

	public void edit() {
		String id = getPara(0);
		PatientQueue patientQueue = service.findById(id);
		setAttr("model", JsonKit.toJson(patientQueue));
		setAttr("id", id);
		setAttr("code", CODE);
		render(BASE_PATH + "patientQueue_edit.html");
	}

	public void view() {
		String id = getPara(0);
		PatientQueue patientQueue = service.findById(id);
		setAttr("model", JsonKit.toJson(patientQueue));
		setAttr("id", id);
		setAttr("code", CODE);
		render(BASE_PATH + "patientQueue_view.html");
	}

	public void list() {
		Object grid = paginate(LIST_SOURCE);
		renderJson(grid);
	}

	public void save() {
		PatientQueue patientQueue = mapping(PERFIX, PatientQueue.class);
		boolean temp = service.save(patientQueue);
		if (temp) {
			renderJson(success(SAVE_SUCCESS_MSG));
		} else {
			renderJson(error(SAVE_FAIL_MSG));
		}
	}

	public void update() {
		PatientQueue patientQueue = mapping(PERFIX, PatientQueue.class);

		boolean temp = service.update(patientQueue);
		if (temp) {
			renderJson(success(UPDATE_SUCCESS_MSG));
		} else {
			renderJson(error(UPDATE_FAIL_MSG));
		}
	}

	public void remove() {
		String ids = getPara("ids");
		int cnt = service.deleteByIds(ids);
		if (cnt > 0) {
			renderJson(success(DEL_SUCCESS_MSG));
		} else {
			renderJson(error(DEL_FAIL_MSG));
		}
	}

	/*
	 * 患者编号 必要 patient_id Varchar(50) NOT NULL 患者唯一编号 病人姓名 必要 patient_name
	 * Varchar(20) NOT NULL 队列类型编号 必要 queue_type_source_id Varchar (100) NOT
	 * NULL 对应Queue_type排队队列视图中source_id字段 数据源扫描条码 source_code Varchar(200)
	 * 可设置多个扫描条码，磁条卡号码等
	 * 
	 * 注：多种条码时可自定义字段名称 例如： source_code1 source_code2 挂号单号或检查单号 register_id
	 * varchar(20) NOT NULL
	 * 显示患者编号用，如有特殊需求可对此项定制。例如“+1号”；取排队队列的序号或科室排队队列的序号（挂号条上的队列排队序号） 队列编号
	 * queue_num Double NOT NULL
	 * 每种队列的排队顺序，默认与register_id(数据为整数的情况下)相同，如需按照挂号时间先后排序，可将此项值设置为0 队列级别
	 * sub_queue_order Tinyint(4) NOT NULL
	 * 如队列有多种优先组合时使用。叫号优先级，默认情况下固定值为0，如有特殊群体需叫号优先请取值1或更大数字。数字越大优先级越高。 队列级别名称
	 * sub_queue_type Varchar(20) NOT NULL 不同叫号优先级队列级别的显示名称：军人、预约、初诊等 午别
	 * time_interval Tinyint(4) 0,1,2 0,全天 1,上午 2,下午 医生编号 doctor_source_id
	 * Varchar (100) 挂号或开检查单时指定医生时使用 对应视图Doctor中的Login_id 退号标识 is_deleted
	 * Tinyint 0,1 退号，退费等数据对比删除处理；如不存在此项处理则固定0 as is_deleted 1，  需删除； 0，正常 时间戳
	 * fre_date Datetime NOT NULL 挂号时间、登记时间、取号时间等 扩展字段 Content text
	 * 如有特殊显示需求，可将此字段进行扩展
	 */

	public void save_patient() {
		Map<String, Object> map = new HashMap<String, Object>();
		// 获取参数值
		String patient_strs = getPara("patients");
		if (StrKit.isBlank(patient_strs)) {
			map.put("code", -1);
			map.put("msg", "请传值");
			renderJson(map);
			return;
		} else {
			JSONArray patientList = JSONArray.parseArray(patient_strs);
			if (patientList != null) {
				PatientQueue pq = null;
				for (Object json : patientList) {
					JSONObject patient_json = (JSONObject) json;
					pq = new PatientQueue();
					// 队列
					QueueTypeService qt = new QueueTypeServiceImpl();
					// 医生
					DoctorService ds = new DoctorServiceImpl();
					// 根据医生登陆工号查询
					Doctor d = ds.findByLogin_id(patient_json
							.getString("doctor_source_id"));
					if (null != d) {
						// 设置医生id
						pq.setDoctor_id(d.getDoctor_id());
					}
					// 设置患者唯一标识
					pq.setPatient_id(patient_json.getString("patient_id"));
					// 设置患者名称
					pq.setPatient_name(patient_json.getString("patient_name"));
					// 设置队列号
					pq.setQueue_type_source_id(patient_json
							.getString("queue_type_source_id"));
					// 根据队列号查询
					QueueType queuetype = qt.findBySource_id(patient_json
							.getString("queue_type_source_id"));
					if(null==queuetype){
						map.put("code", -1);
						map.put("msg", "队列编号不能为空,请确认是否有队列");
						renderJson(map);
						return;
					}
					// 获取队列id
					int queue_type_id = queuetype.getQueue_type_id();
					// 设置队列id
					pq.setQueue_type_id(queue_type_id);
					// 设置队列级别
					pq.setSub_queue_order(patient_json
							.getInteger("sub_queue_order"));
					// 设置队列级别名称
					pq.setSub_queue_type(patient_json
							.getString("sub_queue_type"));
					// 设置午别
					pq.setTime_interval(patient_json
							.getInteger("time_interval"));
					// 1报道
					if ("1".equals(queuetype.getIs_checkin().toString())) {
						// 设置患者隐藏
						pq.setIs_display(1);
					} else if ("2".equals(queuetype.getIs_checkin().toString())) {
						// 设置患者显示
						pq.setIs_display(2);
					}
					// 重新排序1重新排序
					if ("1".equals(queuetype.getIs_reorder().toString())) {
						int register_id = 0;
						for (int i = 0; i < patient_json.size(); i++) {
							// 查询最大值
							List<Record> list = service.maxregisterid(String
									.valueOf(queue_type_id));
							if (null == list || list.size() == 0) {
								register_id = 1;
							} else {
								register_id = list.get(0).getInt("register_id");
							}
							pq.setRegister_id(String.valueOf(register_id));
							i++;
						}
						// 2不重新排序
					} else if ("2".equals(queuetype.getIs_reorder().toString())) {
						pq.setRegister_id(patient_json.getString("register_id"));
					} else {
						return;
					}
					//
					pq.setQueue_num(patient_json.getString("queue_num"));
					// 退号标识
					pq.setIs_deleted(patient_json.getInteger("is_deleted"));
					// 挂号时间
					pq.setFre_date(patient_json.getDate("fre_date"));
					// 操作时间
					pq.setOpr_time(new SimpleDateFormat(
							"yyyy-MM-dd HH:mm:ss:SSS").format(new Date()));
					// 患者初诊
					pq.setState_patient(0);
					boolean bool = false;
					try {
						bool = service.save(pq);
					} catch (Exception e) {
						map.put("code", -1);
						map.put("msg",
								"保存失败,患者编号："
										+ patient_json.getString("patient_id")
										+ "不是唯一值");
						renderJson(map);
						return;
					}
					if (bool) {
						map.put("code", 200);
						map.put("msg", "保存成功");
						renderJson(map);
						// 卡号
						PatientCode pc = new PatientCode();
						// 设置卡号
						pc.setCode(patient_json.getString("source_code"));
						// 根据唯一标识查询
						PatientQueue qp = service.findByPatient_id(patient_json
								.getString("patient_id"));
						// 获取患者id
						int patient_queue_id = qp.getId();
						// 设置患者id
						pc.setPatient_queue_id(patient_queue_id);
						PatientCodeService pcser = new PatientCodeServiceImpl();
						// 保存卡号
						pcser.save(pc);
					} else {
						map.put("code", -1);
						map.put("msg", "保存失败");
						renderJson(map);
						return;
					}
				}
			}
		}
		renderJson(map);
	}
	
	public void deletepatient(){
		service.deletepatient();
		/*List<Record> list= service.querytable();
		if(list.isEmpty()){
			Blade.create(PatientQueue.class).find("PatientQueue.setidentity", null);
		}*/
	}
}
